<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<title>00p3(原型-根据实例对象夺得原型对象)</title>
</head>
<body>
<script type="text/javascript">
	
	//Object.getPrototypeOf() :  根据实例对象夺得原型对象
	
	function People () {}
	People.prototype.name = "z3";
	People.prototype.age = 24;
	People.prototype.getName = function () {
		alert("我是原型对象的方法");
	};
	/*
	var p1 = new People();
	alert(p1.name);
	var prototypeObj = Object.getPrototypeOf(p1);
	alert(prototypeObj == People.prototype);
	*/

	/* 每次代码读取一个对象的属性的时候，首先会进行一次搜索，搜索实例对象里name的属性，看看有没有
	 * 如果没有，再去p2的实例所对应的原型对象里去搜索name属性，如果有就返回，没有返回undefeated
	 */
	/*
	var p2 = new People();
	p2.name = "z6";	//实例对象的name
	delect p2.name;
	alert(p2.name);	// 就想获取原型对象的name属性
	*/

	//判断一个属性属于实例对象还是原型对象
	/*
	var p3 = new People();
	p3.name = "z4";
	alert(p3.name);
	alert(p3.hasOwnProperty('name')); //true
	*/

	//in操作符 for-in

	//判断一个属性是否存在于实例对象和原型中
	/*
	var p4 = new People();
	alert('name' in p4);	//true
	var p5 = new People();
	p5.name = "w5";
	alert('name' in p5);	//true
	*/

	//就是判断一个属性 是否存在原型中
	//在原型对象中属否存在这个属性，第一个参数：当前对象；第二个参数：要判断的属性
	/*
	function hasPrototypeProperty (object, name) {
		return !object.hasOwnProperty(name) && name in object;
	}

	var p6 = new People();
	p6.name = "w6";
	alert(hasPrototypeProperty(p6, 'name'));
	*/

	//ECMA5 新特性 Object.keys();
	//拿到当前对象里的keys，返回一个数组

	var p7 = new People();
	p7.name = "x9";
	p7.age = 30;

	var arr1 = Object.keys(p7);
	//alert(arr1);

	var arr2 = Object.keys(People.prototype);
	//alert(arr2);

	//ECMA5 constructor不能被枚举[eable = false]
	//Object.getOwnPropertyNames()枚举对象的所有属性，不管属性是否能被枚举

	alert(Object.getOwnPropertyNames(p7));
	alert(Object.getOwnPropertyNames(People.prototype));

</script>
</body>
</html>